/**
 * 托盘管理器
 * 负责创建系统托盘图标、处理最小化到托盘和托盘闪烁通知
 */

let nw = typeof window !== 'undefined' && window.nw ? window.nw : undefined;
let win = nw ? nw.Window.get() : null;
let tray = null;
let flashInterval = null;
let isFlashing = false;
let isMinimizedToTray = false;
let isWindowMinimized = false; // 添加最小化状态跟踪

// 存储用户的退出选择
let exitChoice = null;

// 托盘图标路径
const ICON_NORMAL = process.env.NODE_ENV === 'development' ? './static/tray.png' : '/static/tray.png';
const ICON_NOTIFY = process.env.NODE_ENV === 'development' ? './static/tray-notify.png' : '/static/tray-notify.png';

// 存储用户的选择
const saveExitChoice = (toTray) => {
  try {
    localStorage.setItem('exitToTray', toTray ? 'true' : 'false');
    exitChoice = toTray;
  } catch (e) {
    console.error('保存退出选项失败:', e);
  }
};

// 获取用户的选择
const getExitChoice = () => {
  if (exitChoice !== null) {
    return exitChoice;
  }
  
  try {
    const saved = localStorage.getItem('exitToTray');
    if (saved !== null) {
      exitChoice = saved === 'true';
      return exitChoice;
    }
  } catch (e) {
    console.error('获取退出选项失败:', e);
  }
  
  return null; // 没有保存过选择
};

// 初始化托盘
export const initTray = () => {
  if (!nw) {
    console.warn('NW.js 未初始化，无法创建托盘图标');
    return;
  }

  try {
    console.log('初始化托盘图标，正常图标路径:', ICON_NORMAL);
    console.log('初始化托盘图标，通知图标路径:', ICON_NOTIFY);
    
    // 创建一个托盘图标
    tray = new nw.Tray({
      title: '局域网即时通讯系统',
      icon: ICON_NORMAL,
      tooltip: '局域网即时通讯系统'
    });

    // 创建托盘菜单
    const menu = new nw.Menu();
    
    // 添加菜单项 - 显示窗口
    menu.append(new nw.MenuItem({
      label: '显示窗口',
      click: () => {
        showWindow();
      }
    }));

    // 添加分隔线
    menu.append(new nw.MenuItem({ type: 'separator' }));

    // 添加菜单项 - 退出
    menu.append(new nw.MenuItem({
      label: '退出程序',
      click: () => {
        win.close(true); // 传入true表示强制关闭窗口
      }
    }));

    // 将菜单与托盘关联
    tray.menu = menu;

    // 点击托盘图标时显示窗口
    tray.on('click', () => {
      showWindow();
      stopFlashTray(); // 停止闪烁
    });

    // 监听窗口关闭事件
    win.on('close', function() {
      const savedChoice = getExitChoice();
      
      // 如果已经有保存的选择，直接使用
      if (savedChoice !== null) {
        if (savedChoice) {
          minimizeToTray();
        } else {
          win.close(true);
          if (tray) {
            tray.remove();
            tray = null;
          }
        }
        return;
      }
      
      // 第一次询问用户选择
      const result = confirm('是否最小化到系统托盘？\n点击"确定"将最小化到托盘，点击"取消"将直接退出程序。\n您的选择将被记住，下次不再询问。');
      
      // 保存用户的选择
      saveExitChoice(result);
      
      if (result) {
        // 最小化到托盘
        minimizeToTray();
      } else {
        // 退出程序
        win.close(true);
        if (tray) {
          tray.remove();
          tray = null;
        }
      }
    });

    // 监听窗口状态
    monitorWindowState();

    console.log('托盘图标初始化成功');
  } catch (error) {
    console.error('创建托盘图标失败:', error);
  }
};

// 最小化到托盘
export const minimizeToTray = () => {
  if (!win || !tray) return;
  
  win.hide();
  isMinimizedToTray = true;
};

// 显示窗口
export const showWindow = () => {
  if (!win) return;
  
  win.show();
  win.focus();
  isMinimizedToTray = false;
  
  // 停止闪烁
  stopFlashTray();
};

// 开始闪烁托盘图标
export const startFlashTray = () => {
  if (!tray || isFlashing) return;
  
  isFlashing = true;
  let isNotifyIcon = false;
  
  // 如果窗口没有隐藏到托盘且没有最小化，则不闪烁
  if (!isMinimizedToTray && !isWindowMinimized) {
    console.log('窗口没有最小化或隐藏到托盘，不闪烁图标');
    return;
  }
  
  // 如果窗口最小化了但是没有在托盘，尝试显示系统通知
  if (isWindowMinimized && !isMinimizedToTray) {
    try {
      showNativeNotification('新消息', '您有新的消息，点击查看');
    } catch (e) {
      console.error('显示系统通知失败:', e);
    }
  }
  
  flashInterval = setInterval(() => {
    isNotifyIcon = !isNotifyIcon;
    tray.icon = isNotifyIcon ? ICON_NOTIFY : ICON_NORMAL;
  }, 500);
};

// 停止闪烁托盘图标
export const stopFlashTray = () => {
  if (!isFlashing) return;
  
  clearInterval(flashInterval);
  if (tray) {
    tray.icon = ICON_NORMAL;
  }
  isFlashing = false;
};

// 显示系统原生通知
export const showNativeNotification = (title, message, timeout = 5000) => {
  try {
    let notification;
    
    if (typeof Notification !== 'undefined') {
      notification = new Notification(title, {
        body: message,
        icon: ICON_NOTIFY
      });
      
      notification.onclick = () => {
        showWindow();
      };
    } else if (win && win.window && win.window.Notification) {
      notification = new win.window.Notification(title, {
        body: message,
        icon: ICON_NOTIFY
      });
      
      notification.onclick = () => {
        showWindow();
      };
    } else {
      console.warn('通知API不可用');
      return;
    }
    
    // 设置通知自动关闭的超时时间
    if (notification) {
      setTimeout(() => {
        if (notification.close) {
          notification.close();
        }
      }, timeout);
    }
  } catch (e) {
    console.error('创建通知失败:', e);
  }
};

// 判断是否最小化到了托盘或窗口被最小化
export const isInTray = () => {
  return isMinimizedToTray || isWindowMinimized;
};

// 重置退出选择（如果用户想要更改选择）
export const resetExitChoice = () => {
  try {
    localStorage.removeItem('exitToTray');
    exitChoice = null;
    console.log('退出选项已重置');
  } catch (e) {
    console.error('重置退出选项失败:', e);
  }
};

// 监听窗口最小化状态
const monitorWindowState = () => {
  if (!win) return;
  
  // 监听窗口最小化事件
  win.on('minimize', () => {
    isWindowMinimized = true;
    console.log('窗口已最小化');
  });
  
  // 监听窗口恢复事件
  win.on('restore', () => {
    isWindowMinimized = false;
    console.log('窗口已恢复');
    // 停止闪烁
    stopFlashTray();
  });
};

export default {
  initTray,
  minimizeToTray,
  showWindow,
  startFlashTray,
  stopFlashTray,
  isInTray,
  resetExitChoice,
  showNativeNotification
}; 